home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 63140 / 63140.xpi / chrome / content / tabundle.js < prev   
Text File  |  2010-01-24  |  7KB  |  236 lines

  1. var Tabundle = function() {}
  2. Tabundle.id = 'tabundle@relucks.org'
  3. Tabundle.contentPath = 'chrome://tabundle/content'
  4. Components.utils.import('resource://tabundle-modules/ioutils.jsm', Tabundle)
  5.  
  6. Tabundle.init = function() {
  7.     var ext = Components.classes["@mozilla.org/extensions/manager;1"].
  8.         getService(Components.interfaces.nsIExtensionManager).
  9.         getInstallLocation(Tabundle.id).
  10.         getItemLocation(Tabundle.id)
  11.     Tabundle.extDir = ext.path
  12.  
  13.     if (!Tabundle.getHtmlDir()) {
  14.         var profDir = Components.classes["@mozilla.org/file/directory_service;1"].
  15.             getService(Components.interfaces.nsIProperties).
  16.             get("ProfD", Components.interfaces.nsIFile)
  17.         profDir.append('tabundle')
  18.         Tabundle.IOUtils.mkdir(profDir)
  19.         Tabundle.setHtmlDir(profDir.path)
  20.     }
  21. }
  22.  
  23. Tabundle.view = function() {
  24.     var path = Tabundle.createIndexHtml()
  25.     gBrowser.selectedTab = gBrowser.addTab(path)
  26. }
  27.  
  28. Tabundle.getHtmlDir = function() {
  29.     return Application.prefs.getValue('extensions.tabundle.htmlDir', null)
  30. }
  31.  
  32. Tabundle.setHtmlDir = function(dir) {
  33.     return Application.prefs.setValue('extensions.tabundle.htmlDir', dir)
  34. }
  35.  
  36. Tabundle.archives = function() {
  37.     var file = Tabundle.IOUtils.getFile(Tabundle.getHtmlDir())
  38.     var entries = file.directoryEntries
  39.     var list = []
  40.     while (entries.hasMoreElements()) {
  41.         var entry = entries.getNext().QueryInterface(Components.interfaces.nsIFile)
  42.         list.push(entry.leafName)
  43.     }
  44.     return list.filter(function(i) {
  45.         return /\.html$/.test(i) && i != 'index.html'
  46.     })
  47. }
  48.  
  49. Tabundle.bundle = function() {
  50.     Tabundle.createIndexHtml()
  51.     var path = Tabundle.createListHtml()
  52.     if (path) {
  53.         gBrowser.selectedTab = gBrowser.addTab('file://' + path)
  54.     }
  55. }
  56.  
  57. Tabundle.dateString = function() {
  58.     var d = new Date()
  59.     var list = [d.getFullYear(), d.getMonth() + 1, d.getDate()]
  60.     return list.map(function(i) {
  61.         var s = i.toString()
  62.         return s.length == 1 ? '0' + s : s
  63.     }).join('-')
  64.     // return d.toLocaleFormat('%Y-%m-%d')
  65. }
  66.  
  67. Tabundle.createListHtml = function() {
  68.     var height = window.innerHeight
  69.     var list = Array.map(gBrowser.mTabs, function(tab) {
  70.         var w = gBrowser.getBrowserForTab(tab).contentWindow
  71.         var c = Tabundle.capture(w, {x: 0, y:0}, {h: height, w: w.innerWidth}, 0.3)
  72.         return [w.document.title, w.location.href, c]
  73.     })
  74.     var date = Tabundle.dateString()
  75.     var size = gBrowser.mTabs.length.toString()
  76.     var opt = {
  77.         list: list,
  78.         size: size,
  79.         date: date,
  80.         title: size + 'Tabs ' + date,
  81.         fav: Tabundle.icon(size).toDataURL(),
  82.         style: Tabundle.style()
  83.     }
  84.     var html = Tabundle.listHtml(opt)
  85.     var fileName = date + '.html'
  86.     var out = Tabundle.IOUtils.getFile(Tabundle.getHtmlDir())
  87.     out.append(fileName)
  88.     var path = out.path
  89.  
  90.     if (out.exists()) {
  91.         var opt = {
  92.             mode: Components.interfaces.nsIFilePicker.modeSave,
  93.             defaultString: fileName,
  94.             displayDirectory: Tabundle.IOUtils.getFile(Tabundle.getHtmlDir()),
  95.             filters: Components.interfaces.nsIFilePicker.filterHTML
  96.         }
  97.         path = Tabundle.selectFile(opt)
  98.     }
  99.  
  100.     if (path) {
  101.         Tabundle.IOUtils.write(path, html)
  102.         return path
  103.     }
  104. }
  105.  
  106. Tabundle.listHtml = function(opt) {
  107.     var html = <html>
  108.         <head>
  109.             <link rel="shortcut icon" href={opt['fav']} />
  110.             <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  111.             <title>{opt['title']}</title>
  112.             <style type="text/css">{opt['style']}</style>
  113.         </head>
  114.         <body>
  115.             <h1><img src={opt['fav']} />{opt['title']}</h1>
  116.         </body>
  117.     </html>
  118.     var ul = <ul id="tabundle_list"></ul>
  119.     opt['list'].forEach(function(i) {
  120.         var li = <li>
  121.             <div class="capture"><a href={i[1]}><img src={i[2]} /></a></div>
  122.             <div class="title"><a href={i[1]}>{i[0]}</a></div>
  123.             <div class="url"><a href={i[1]}>{i[1]}</a></div>
  124.             <br />
  125.         </li>
  126.         ul.appendChild(li)
  127.     })
  128.     html.body.ul = ul
  129.     return html.toXMLString()
  130. }
  131.  
  132. Tabundle.createIndexHtml = function() {
  133.     var icon = Tabundle.icon(20).toDataURL()
  134.     var opt = {
  135.         list: Tabundle.archives().reverse(),
  136.         fav: icon,
  137.         icon: icon,
  138.         style: Tabundle.style()
  139.     }
  140.     var indexHtml = Tabundle.indexHtml(opt)
  141.     var out = Tabundle.IOUtils.getFile(Tabundle.getHtmlDir())
  142.     out.append('index.html')
  143.     Tabundle.IOUtils.write(out, indexHtml)
  144.     return out.path
  145. }
  146.  
  147. Tabundle.indexHtml = function(opt) {
  148.     var html = <html>
  149.         <head>
  150.             <link rel="shortcut icon" href={opt['fav']} />
  151.             <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  152.             <title>Tabundle</title>
  153.             <style type="text/css">{opt['style']}</style>
  154.         </head>
  155.         <body>
  156.             <h1><img src={opt['icon']} />Tabundle</h1>
  157.         </body>
  158.     </html>
  159.     var ul = <ul id="tabundle_index"></ul>
  160.     opt['list'].forEach(function(i) {
  161.         var url = 'file://' + Tabundle.getHtmlDir() + '/' + i
  162.         var li = <li><a href={url}>{i}</a></li>
  163.         ul.appendChild(li)
  164.     })
  165.     html.body.ul = ul
  166.     return html.toXMLString()
  167. }
  168.  
  169. Tabundle.capture = function(win, pos, dim, scale){
  170.     var HTML_NS = 'http://www.w3.org/1999/xhtml'
  171.     var canvas = document.createElementNS(HTML_NS, 'canvas')
  172.     var ctx = canvas.getContext('2d')
  173.     canvas.width = dim.w
  174.     canvas.height = dim.h
  175.     if (scale) {
  176.         scale   = scale.w? scale.w/dim.w : scale.h? scale.h/dim.h : scale;
  177.         canvas.width = dim.w * scale
  178.         canvas.height = dim.h * scale
  179.         ctx.scale(scale, scale)
  180.     }
  181.     ctx.drawWindow(win, pos.x, pos.y, dim.w, dim.h, '#fff')
  182.     return canvas.toDataURL('image/png', '')
  183. }
  184.  
  185. Tabundle.icon = function(size) {
  186.     var HTML_NS = 'http://www.w3.org/1999/xhtml'
  187.     var canvas = document.createElementNS(HTML_NS, 'canvas')
  188.     var ctx = canvas.getContext('2d')
  189.     canvas.width = 50
  190.     canvas.height = 50
  191.     ctx.fillStyle = '#fff'
  192.     ctx.fillRect(0 , 15, canvas.width, 20)
  193.     ctx.fillStyle = '#0af'
  194.     ctx.fillRect(0 , 15, (size > 50 ? 50 : size), 20)
  195.     return canvas
  196. }
  197.  
  198. Tabundle.style = function() {
  199.     var file = Tabundle.IOUtils.getFile(Tabundle.extDir)
  200.     file.append('chrome')
  201.     file.append('content')
  202.     file.append('tabundle.css')
  203.     return Tabundle.IOUtils.read(file)
  204. }
  205.  
  206. Tabundle.pref = function() {
  207.     var url = 'chrome://tabundle/content/pref.xul'
  208.     return window.openDialog(url, "_blank", "resizable,dialog=no,centerscreen");
  209. }
  210.  
  211. Tabundle.selectFile = function(opt) {
  212.     var opt = opt || {}
  213.     var nfp = Components.interfaces.nsIFilePicker
  214.     var fp = Components.classes['@mozilla.org/filepicker;1'].createInstance(nfp)
  215.     var title = opt['title'] || 'Select a File'
  216.     var mode = opt['mode'] || nfp.modeOpen
  217.     fp.init(window, title, mode)
  218.  
  219.     if (opt['defaultString']) {
  220.         fp.defaultString = opt['defaultString']
  221.     }
  222.     if (opt['displayDirectory']) {
  223.         fp.displayDirectory = opt['displayDirectory']
  224.     }
  225.     if (opt['filters']) {
  226.         fp.appendFilters(opt['filters'])
  227.     }
  228.     var r = fp.show()
  229.     if (r == nfp.returnOK || r == nfp.returnReplace) {
  230.         return fp.file.path
  231.     }
  232. }
  233.  
  234. Tabundle.init()
  235.  
  236.